#include <gpiod.h>
#include <stdio.h>
#include <unistd.h>
#include <linux/input.h>

//控制蜂鸣器发出指定频率的声音
void tone(int hz)
{
    FILE* fp = fopen("/dev/input/event0", "w");
    if (fp == NULL)
    {
        perror("fopen");
        return;
    }

    struct input_event event;
    event.type = EV_SND;   //声音事件
    event.code = SND_TONE; //设置声音音高
    //atoi函数将字符串转为整数
    event.value = hz;     //发出指定频率的声音

    //向文件中写入二进制数据
    //参数1：写入数据的起始地址
    //参数2：写入数据大小
    //参数3：写入次数
    //参数4：写入的文件
    fwrite(&event, sizeof event, 1, fp);

    fclose(fp);
}

int main()
{
    //打开GPIO控制器
    struct gpiod_chip* gpiof = gpiod_chip_open_by_label("GPIOF");
    if (gpiof == NULL)
    {
        perror("GPIOF");
        return 1;
    }

    //获取GPIO引脚
    struct gpiod_line* key2 = gpiod_chip_get_line(gpiof, 7);
    if (key2 == NULL)
    {
        perror("PF7");
        return 1;
    }

    //获取火焰传感器引脚
    struct gpiod_line* flame = gpiod_chip_get_line(gpiof, 5);
    if (flame == NULL)
    {
        perror("PF5");
        return 1;
    }

    //占用GPIO引脚，并将GPIO引脚设置为输入模式
    int error = gpiod_line_request_input(key2, "button");
    if (error)
    {
        perror("key2");
        return 1;
    }

    error = gpiod_line_request_input(flame, "button");
    if (error)
    {
        perror("flame");
        return 1;
    }

    while (1)
    {
        if (gpiod_line_get_value(flame) == 1)
        {
            printf("发现火情\n");
            tone(1000);
        }

        if (gpiod_line_get_value(key2) == 0)
        {
            printf("按键按下，停止报警\n");
            tone(0);
        }
        sleep(1);
    }

    //释放GPIO引脚
    gpiod_line_release(key2);
    gpiod_line_release(flame);

    //关闭GPIO控制器
    gpiod_chip_close(gpiof);
    return 0;
}
